트랜스포머
개요
트랜스포머(Transformer)는 자연어처리LP) 분야 혁신적인 영향을 미친 딥러닝 아키텍처로, 2017년글과 빌런드 연구소의 연구자들이 발표한 논문 "Attention is All You Need"에서 처음 소개되었습니다. 기존의 순차적 처리 방식을 기반으로 한 순환신경망(RNN)이나 합성곱신경망(CNN)과 달리, 트랜스포머는 어텐션 메커니즘(Attention Mechanism)에만 의존하여 입력 시퀀스의 각 단어 간의 관계를 병렬적으로 파악함으로써 처리 속도와 성능을 크게 향상시켰습니다.
트랜스포머는 번역, 텍스트 생성, 질문 응답, 요약 등 다양한 자연어처리 과제에서 뛰어난 성능을 보이며, 이후 BERT, GPT, T5 등의 선도적인 언어 모델의 기반이 되었습니다. 현재는 자연어처리 분야의 사실상 표준 아키텍처로 자리 잡고 있습니다.
구조와 동작 원리
트랜스포머는 인코더(Encoder)와 디코더(Decoder)로 구성된 인코더-디코더 구조를 가지고 있으며, 각각은 여러 개의 동일한 레이어로 쌓여 있습니다. 이 구조는 입력 문장을 인코딩하고, 이를 바탕으로 출력 문장을 생성하는 데 사용됩니다.
1. 인코더 (Encoder)
인코더는 입력 시퀀스를 고차원 벡터 표현으로 변환합니다. 각 인코더 레이어는 다음과 같은 두 개의 주요 서브층(sub-layer)으로 구성됩니다:
- 자기 주의(self-attention) 레이어: 입력 시퀀스의 각 단어가 다른 단어들과 어떤 관계를 가지는지를 계산합니다. 예를 들어, 문장 "The cat sat on the mat because it was tired."에서 "it"이 "cat"을 가리키는지 여부를 판단하는 데 사용됩니다.
- 피드포워드 신경망(Feed-Forward Neural Network): 자기 주의를 통해 얻은 표현을 추가로 처리하는 완전 연결 네트워크입니다.
각 서브층 이후에는 레이어 정규화(Layer Normalization)와 잔차 연결(Residual Connection)이 적용되어 학습 안정성을 높입니다.
2. 디코더 (Decoder)
디코더는 인코더의 출력을 바탕으로 출력 시퀀스를 생성합니다. 디코더 레이어는 세 개의 서브층으로 구성됩니다:
- 마스크된 자기 주의 레이어: 출력 시퀀스를 생성할 때 미래의 단어를 참조하지 못하도록 제한하는 자기 주의입니다. 예를 들어, 두 번째 단어를 생성할 때는 첫 번째 단어까지만 참조할 수 있습니다.
- 인코더-디코더 어텐션 레이어: 인코더의 출력과 디코더의 현재 상태를 결합하여 관련 정보를 집중합니다.
- 피드포워드 신경망: 최종 처리를 수행합니다.
디코더도 인코더와 마찬가지로 잔차 연결과 레이어 정규화를 사용합니다.
핵심 기술: 어텐션 메커니즘
트랜스포머의 핵심은 멀티헤드 어텐션(Multi-Head Attention)입니다. 이 메커니즘은 입력 시퀀스 내의 모든 위치에서 정보를 동시에 참조할 수 있게 하며, 병렬 처리를 가능하게 합니다.
스케일드 닷 프로덕트 어텐션 (Scaled Dot-Product Attention)
입력으로 쿼리(Query), 키(Key), 값(Value) 벡터를 받아 다음 수식으로 어텐션 가중치를 계산합니다:
[
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V
]
여기서 (d_k)는 키 벡터의 차원입니다. 나누기는 소프트맥스의 기울기를 안정화하기 위한 조정입니다.
멀티헤드 어텐션
여러 개의 어텐션 헤드를 병렬로 실행하여 다양한 표현 공간에서 정보를 추출한 후, 이를 결합합니다. 이는 모델이 단어 간의 다양한 관계(예: 문법적, 의미적)를 동시에 학습할 수 있게 합니다.
# 간단한 멀티헤드 어텐션 구현 (의사코드)
class MultiHeadAttention:
def __init__(self, d_model, num_heads):
self.num_heads = num_heads
self.d_k = d_model // num_heads
self.W_q = Linear(d_model, d_model)
self.W_k = Linear(d_model, d_model)
self.W_v = Linear(d_model, d_model)
self.W_o = Linear(d_model, d_model)
def forward(self, Q, K, V):
Q, K, V = self.W_q(Q), self.W_k(K), self.W_v(V)
Q, K, V = split_heads(Q), split_heads(K), split_heads(V)
attention_output = scaled_dot_product_attention(Q, K, V)
return self.W_o(concat_heads(attention_output))
장점과 한계
장점
- 병렬 처리 가능: RNN과 달리 순차 처리가 필요 없어 학습 속도가 빠릅니다.
- 장거리 의존성 학습 우수: 문장 내 멀리 떨어진 단어 간 관계도 효과적으로 포착합니다.
- 확장성: 레이어를 깊게 쌓거나 모델 크기를 늘려 성능을 지속적으로 향상시킬 수 있습니다.
한계
- 메모리 사용량 큼: 전체 입력 시퀀스에 대한 어텐션을 계산하므로 긴 시퀀스에서 메모리 소모가 큽니다.
- 학습 데이터 의존성: 방대한 데이터가 필요하며, 소규모 데이터에서는 과적합 우려가 있습니다.
관련 모델 및 발전
트랜스포머는 이후 다음과 같은 주요 언어 모델의 기반이 되었습니다:
| 모델 |
특징 |
| BERT |
인코더 기반, 양방향 어텐션, 사전 학습 + 파인튜닝 |
| GPT |
디코더 기반, 단방향 어텐션, 텍스트 생성 중심 |
| T5 |
인코더-디코더 전체 사용, 텍스트를 모두 입력-출력 텍스트로 변환 |
이들 모델은 트랜스포머의 기본 구조를 활용하여 각각의 과제에 최적화된 방식으로 발전하였습니다.
입력 데이터 처리 및 임베딩
트랜스포머는 텍스트 데이터를 직접 처리할 수 없으므로, 수치형 벡터로 변환하는 전처리 과정이 필수적입니다.
토큰화 및 임베딩
먼저 입력 문장은 토큰화(Tokenization) 과정을 통해 최소 의미 단위인 토큰으로 분리됩니다. 분리된 각 토큰은 임베딩 층(Embedding Layer)을 통해 $d_{model}$ 차원의 연속적인 벡터로 변환됩니다. 이 과정에서 단어의 의미적 유사성이 벡터 공간상의 거리로 표현됩니다.
포지셔널 인코딩 (Positional Encoding)
RNN과 달리 트랜스포머는 모든 토큰을 동시에 병렬로 처리하므로, 단어의 위치 정보(Sequential Order)를 알 수 없습니다. 이를 해결하기 위해 임베딩 벡터에 위치 정보를 더해주는 포지셔널 인코딩을 사용합니다.
트랜스포머는 서로 다른 주기를 가진 사인(sine)과 코사인(cosine) 함수를 사용하여 위치 값을 생성합니다:
$$PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}})$$
$$PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}})$$
- $pos$: 토큰의 절대적 위치
- $i$: 차원 인덱스
- $d_{model}$: 모델의 임베딩 차원
이러한 함수적 접근은 모델이 학습 데이터에서 보지 못한 더 긴 시퀀스에 대해서도 상대적인 위치 관계를 일반화하여 학습할 수 있게 합니다.
아키텍처의 세부 구성 요소
모델 차원 및 피드포워드 네트워크
트랜스포머의 모든 서브층은 일관된 모델 차원($d_{model}$)을 유지합니다. 각 어텐션 층 이후에는 포지션 와이즈 피드포워드 네트워크(Position-wise Feed-Forward Network)가 배치됩니다.
이 네트워크는 두 개의 선형 변환과 하나의 ReLU 활성화 함수로 구성됩니다:
$$\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2$$
일반적으로 내부 은닉층의 차원은 $d_{model}$보다 훨씬 크게 설정(예: $d_{model}=512 \rightarrow d_{ff}=2048$)하여 모델의 표현력을 확장합니다.
레이어 정규화 (Layer Normalization)
학습의 안정성과 속도를 높이기 위해 각 서브층의 출력에 레이어 정규화(Layer Normalization)를 적용합니다. 트랜스포머에서는 '잔차 연결 $\rightarrow$ 레이어 정규화' 순서로 이어지는 $\text{LayerNorm}(x + \text{Sublayer}(x))$ 구조를 사용하여 기울기 소실 문제를 방지하고 최적화를 가속화합니다.
데이터 흐름 및 텐서 차원 변화
입력 데이터가 모델을 통과하며 겪는 텐서의 차원 변화는 다음과 같습니다. (단, $B$: 배치 크기, $N$: 시퀀스 길이, $d_{model}$: 모델 차원)
| 단계 |
입력 텐서 차원 |
연산/층 |
출력 텐서 차원 |
비고 |
| 입력 |
$(B, N)$ |
Token Embedding |
$(B, N, d_{model})$ |
정수 인덱스 $\rightarrow$ 벡터 |
| 위치 부여 |
$(B, N, d_{model})$ |
Positional Encoding |
$(B, N, d_{model})$ |
요소별 덧셈(Element-wise sum) |
| 어텐션 |
$(B, N, d_{model})$ |
Multi-Head Attention |
$(B, N, d_{model})$ |
$Q, K, V$ 연산 후 결합 |
| FFN |
$(B, N, d_{model})$ |
Feed-Forward Net |
$(B, N, d_{model})$ |
$d_{model} \rightarrow d_{ff} \rightarrow d_{model}$ |
| 최종 출력 |
$(B, N, d_{model})$ |
Linear $\rightarrow$ Softmax |
$(B, N, \text{vocab\_size})$ |
다음 토큰 확률 분포 생성 |
어텐션 메커니즘의 심층 이해
Q, K, V의 직관적 비유
어텐션 메커니즘의 쿼리(Query), 키(Key), 값(Value)은 정보 검색 시스템과 유사합니다.
- Query (Q): "내가 지금 찾고자 하는 정보가 무엇인가?" (현재 단어의 관점)
- Key (K): "나는 어떤 정보를 가지고 있는가?" (다른 모든 단어들의 색인/특징)
- Value (V): "내가 제공할 실제 내용은 무엇인가?" (실제 의미 정보)
소프트맥스와 어텐션 맵
$QK^T$ 연산을 통해 계산된 유사도 점수에 소프트맥스(Softmax) 함수를 적용하면, 합계가 1이 되는 확률 분포 형태의 어텐션 맵(Attention Map)이 생성됩니다.
(예시 이미지: 단어 간의 관계 강도를 히트맵으로 표현한 어텐션 맵)
이 맵에서 높은 값을 가진 영역은 모델이 특정 단어를 처리할 때 어떤 다른 단어에 집중(Attention)하고 있는지를 시각적으로 보여줍니다.
기술적 한계: 복잡도 분석
트랜스포머의 가장 큰 기술적 제약은 시퀀스 길이($n$)에 따른 자원 소모량입니다.
시간 및 공간 복잡도
셀프 어텐션 과정에서 모든 토큰 쌍 간의 유사도를 계산해야 하므로, 연산량과 메모리 사용량은 다음과 같은 복잡도를 가집니다:
- 시간 복잡도: $O(n^2 \cdot d)$
- 공간 복잡도: $O(n^2)$
즉, 입력 문장의 길이가 2배가 되면 연산량과 메모리 요구량은 4배(제곱)로 증가합니다. 이로 인해 매우 긴 문서(Long-context)를 처리할 때 메모리 부족(Out-of-Memory) 문제가 발생하며, 이를 해결하기 위해 Linear Attention, FlashAttention, 또는 Sparse Attention과 같은 최적화 기법들이 연구되고 있습니다.
데이터 흐름과 모듈 간 상호작용
트랜스포머의 전체 데이터 흐름은 입력 시퀀스가 인코더를 통해 고차원 문맥 벡터로 압축되고, 이를 디코더가 참조하여 출력 시퀀스를 순차적으로 생성하는 유기적인 연결 구조를 가집니다.
전체 데이터 흐름 다이어그램
입력 문장 $\rightarrow$ 인코더(Self-Attention $\rightarrow$ FFN) $\rightarrow$ 문맥 벡터(Memory) $\rightarrow$ 디코더(Masked Self-Attention $\rightarrow$ Encoder-Decoder Attention $\rightarrow$ FFN) $\rightarrow$ 출력 토큰
- 인코더의 역할: 입력된 전체 시퀀스를 동시에 처리하여, 각 토큰이 문장 내 다른 모든 토큰과 맺는 관계를 계산합니다. 결과적으로 생성된 문맥 벡터(Context Vector)는 입력 문장의 의미적 정수를 담고 있는 메모리 역할을 합니다.
- 디코더의 상호작용: 디코더는 두 단계의 어텐션을 통해 정보를 결합합니다. 먼저 마스크된 자기 주의를 통해 지금까지 생성한 단어들 간의 관계를 파악하고, 이어지는 인코더-디코더 어텐션 단계에서 인코더가 제공한 문맥 벡터 중 현재 생성할 단어와 가장 관련이 깊은 부분에 집중(Attention)합니다.
- 최종 도출: 이처럼 '이전 출력 정보'와 '입력 문장 정보'가 결합된 벡터가 최종 선형 층을 통과하여 다음 단어의 확률 분포로 변환됩니다.
멀티헤드 어텐션의 특징 공간(Feature Space) 분석
멀티헤드 어텐션은 단순히 연산을 여러 번 반복하는 것이 아니라, 입력 데이터를 서로 다른 특징 공간(Feature Space)으로 투영하여 다각도로 분석하는 아키텍처적 이점을 제공합니다.
- 다양한 관계 학습: 각 헤드는 서로 다른 가중치 행렬($W_Q, W_K, W_V$)을 가집니다. 예를 들어, 1번 헤드는 '문법적 관계(주어-동사)'에 집중하고, 2번 헤드는 '의미적 관계(대명사-지칭 대상)', 3번 헤드는 '시간적/공간적 순서'를 학습하는 식으로 역할이 분담됩니다.
- 표현력의 확장: 단일 헤드 어텐션은 하나의 평균적인 관계만을 포착하지만, 멀티헤드 구조는 여러 개의 부분 공간(Subspace)에서 추출된 정보를 결합함으로써 문맥의 복잡한 뉘앙스를 훨씬 정교하게 표현할 수 있습니다.
하드웨어 병목과 메모리 계층 구조
트랜스포머의 $O(n^2)$ 복잡도는 단순한 연산 횟수의 증가를 넘어, 실제 GPU 하드웨어의 메모리 계층 구조(Memory Hierarchy)에서 심각한 병목 현상을 일으킵니다.
- HBM vs SRAM: GPU의 메인 메모리(HBM)는 용량이 크지만 속도가 느리고, 칩 내부의 SRAM은 속도가 매우 빠르지만 용량이 매우 작습니다.
- 메모리 벽(Memory Wall) 문제: 표준 어텐션은 $n \times n$ 크기의 거대한 어텐션 맵을 HBM에 쓰고 읽는 과정을 반복합니다. 이때 연산 속도보다 데이터를 메모리에서 읽어오는 속도가 느려 GPU 연산 유닛(CUDA 코어)이 노는 시간이 발생하는 '메모리 바운드(Memory-bound)' 현상이 발생합니다.
- 아키텍처적 접근: 이를 해결하기 위해 중간 결과물을 HBM에 저장하지 않고 SRAM 내에서 즉시 계산하여 메모리 I/O를 최소화하는 방향으로 최적화가 진행되고 있습니다.
아키텍처 변형 및 최적화 구조
표준 트랜스포머의 효율성 문제를 해결하기 위해 다양한 최적화 구조가 제안되었습니다.
FlashAttention의 메모리 절감 원리
FlashAttention은 메모리 읽기/쓰기 횟수를 획기적으로 줄여 속도와 메모리 효율을 동시에 잡은 기법입니다.
- 타일링(Tiling): 거대한 어텐션 행렬을 작은 블록(Tile) 단위로 쪼개어 SRAM에 올립니다.
- 재계산(Recomputation): 역전파(Backpropagation) 시 필요한 거대한 어텐션 맵을 모두 저장하는 대신, 필요한 부분만 SRAM에서 빠르게 재계산하여 HBM 사용량을 $O(n^2)$에서 $O(n)$ 수준으로 낮춥니다.
효율적 어텐션 비교
| 기법 |
핵심 원리 |
복잡도 |
특징 |
| Standard |
모든 토큰 쌍 계산 |
$O(n^2)$ |
정확도가 높으나 긴 문장에 취약 |
| Sparse |
특정 패턴(Local, Strided)만 계산 |
$O(n \sqrt{n})$ 또는 $O(n)$ |
계산량은 줄지만 정보 손실 가능성 있음 |
| Linear |
커널 함수를 이용해 연산 순서 변경 |
$O(n)$ |
매우 빠르나 근사치 계산으로 성능 저하 가능 |
| Flash |
IO-Aware 타일링 및 재계산 |
$O(n^2)$ |
연산량은 같으나 실제 속도와 메모리 효율 극대화 |
인코더-디코더 구성의 전략적 선택
과제의 목적에 따라 트랜스포머의 구성 요소를 선택적으로 사용하는 아키텍처 설계 전략이 필요합니다.
| 구성 방식 |
대표 모델 |
설계 관점 및 선택 기준 |
적합한 과제 |
| 인코더 전용 (Encoder-only) |
BERT, RoBERTa |
입력 문장 전체를 양방향으로 참조하여 깊은 문맥적 의미를 추출하는 데 최적화 |
텍스트 분류, 개체명 인식(NER), 감성 분석 |
| 디코더 전용 (Decoder-only) |
GPT 시리즈, Llama |
이전 토큰들을 바탕으로 다음 토큰을 예측하는 자기회귀(Autoregressive) 생성에 최적화 |
텍스트 생성, 챗봇, 코드 작성 |
| 전체 구조 (Encoder-Decoder) |
T5, BART |
입력 시퀀스를 완전히 이해한 후, 이를 다른 형태의 시퀀스로 변환하는 매핑 구조에 최적화 |
기계 번역, 문서 요약, 문법 교정 |
참고 자료
트랜스포머는 자연어처리의 패러다임을 바꾼 혁신적인 기술이며, 현대의 인공지능 언어 모델 대부분이 그 영향 아래에서 발전하고 있습니다.
# 트랜스포머
## 개요
**트랜스포머**(Transformer)는 자연어처리LP) 분야 혁신적인 영향을 미친 딥러닝 아키텍처로, 2017년글과 빌런드 연구소의 연구자들이 발표한 논문 *"Attention is All You Need"*에서 처음 소개되었습니다. 기존의 순차적 처리 방식을 기반으로 한 순환신경망(RNN)이나 합성곱신경망(CNN)과 달리, 트랜스포머는 **어텐션 메커니즘**(Attention Mechanism)에만 의존하여 입력 시퀀스의 각 단어 간의 관계를 병렬적으로 파악함으로써 처리 속도와 성능을 크게 향상시켰습니다.
트랜스포머는 번역, 텍스트 생성, 질문 응답, 요약 등 다양한 자연어처리 과제에서 뛰어난 성능을 보이며, 이후 BERT, GPT, T5 등의 선도적인 언어 모델의 기반이 되었습니다. 현재는 자연어처리 분야의 사실상 표준 아키텍처로 자리 잡고 있습니다.
---
## 구조와 동작 원리
트랜스포머는 인코더(Encoder)와 디코더(Decoder)로 구성된 **인코더-디코더 구조**를 가지고 있으며, 각각은 여러 개의 동일한 레이어로 쌓여 있습니다. 이 구조는 입력 문장을 인코딩하고, 이를 바탕으로 출력 문장을 생성하는 데 사용됩니다.
### 1. 인코더 (Encoder)
인코더는 입력 시퀀스를 고차원 벡터 표현으로 변환합니다. 각 인코더 레이어는 다음과 같은 두 개의 주요 서브층(sub-layer)으로 구성됩니다:
- **자기 주의(self-attention) 레이어**: 입력 시퀀스의 각 단어가 다른 단어들과 어떤 관계를 가지는지를 계산합니다. 예를 들어, 문장 *"The cat sat on the mat because it was tired."*에서 "it"이 "cat"을 가리키는지 여부를 판단하는 데 사용됩니다.
- **피드포워드 신경망**(Feed-Forward Neural Network): 자기 주의를 통해 얻은 표현을 추가로 처리하는 완전 연결 네트워크입니다.
각 서브층 이후에는 **레이어 정규화**(Layer Normalization)와 **잔차 연결**(Residual Connection)이 적용되어 학습 안정성을 높입니다.
### 2. 디코더 (Decoder)
디코더는 인코더의 출력을 바탕으로 출력 시퀀스를 생성합니다. 디코더 레이어는 세 개의 서브층으로 구성됩니다:
- **마스크된 자기 주의 레이어**: 출력 시퀀스를 생성할 때 미래의 단어를 참조하지 못하도록 제한하는 자기 주의입니다. 예를 들어, 두 번째 단어를 생성할 때는 첫 번째 단어까지만 참조할 수 있습니다.
- **인코더-디코더 어텐션 레이어**: 인코더의 출력과 디코더의 현재 상태를 결합하여 관련 정보를 집중합니다.
- **피드포워드 신경망**: 최종 처리를 수행합니다.
디코더도 인코더와 마찬가지로 잔차 연결과 레이어 정규화를 사용합니다.
---
## 핵심 기술: 어텐션 메커니즘
트랜스포머의 핵심은 **멀티헤드 어텐션**(Multi-Head Attention)입니다. 이 메커니즘은 입력 시퀀스 내의 모든 위치에서 정보를 동시에 참조할 수 있게 하며, 병렬 처리를 가능하게 합니다.
### 스케일드 닷 프로덕트 어텐션 (Scaled Dot-Product Attention)
입력으로 쿼리(Query), 키(Key), 값(Value) 벡터를 받아 다음 수식으로 어텐션 가중치를 계산합니다:
\[
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V
\]
여기서 \(d_k\)는 키 벡터의 차원입니다. 나누기는 소프트맥스의 기울기를 안정화하기 위한 조정입니다.
### 멀티헤드 어텐션
여러 개의 어텐션 헤드를 병렬로 실행하여 다양한 표현 공간에서 정보를 추출한 후, 이를 결합합니다. 이는 모델이 단어 간의 다양한 관계(예: 문법적, 의미적)를 동시에 학습할 수 있게 합니다.
```python
# 간단한 멀티헤드 어텐션 구현 (의사코드)
class MultiHeadAttention:
def __init__(self, d_model, num_heads):
self.num_heads = num_heads
self.d_k = d_model // num_heads
self.W_q = Linear(d_model, d_model)
self.W_k = Linear(d_model, d_model)
self.W_v = Linear(d_model, d_model)
self.W_o = Linear(d_model, d_model)
def forward(self, Q, K, V):
Q, K, V = self.W_q(Q), self.W_k(K), self.W_v(V)
Q, K, V = split_heads(Q), split_heads(K), split_heads(V)
attention_output = scaled_dot_product_attention(Q, K, V)
return self.W_o(concat_heads(attention_output))
```
---
## 장점과 한계
### 장점
- **병렬 처리 가능**: RNN과 달리 순차 처리가 필요 없어 학습 속도가 빠릅니다.
- **장거리 의존성 학습 우수**: 문장 내 멀리 떨어진 단어 간 관계도 효과적으로 포착합니다.
- **확장성**: 레이어를 깊게 쌓거나 모델 크기를 늘려 성능을 지속적으로 향상시킬 수 있습니다.
### 한계
- **메모리 사용량 큼**: 전체 입력 시퀀스에 대한 어텐션을 계산하므로 긴 시퀀스에서 메모리 소모가 큽니다.
- **학습 데이터 의존성**: 방대한 데이터가 필요하며, 소규모 데이터에서는 과적합 우려가 있습니다.
---
## 관련 모델 및 발전
트랜스포머는 이후 다음과 같은 주요 언어 모델의 기반이 되었습니다:
| 모델 | 특징 |
|------|------|
| **BERT** | 인코더 기반, 양방향 어텐션, 사전 학습 + 파인튜닝 |
| **GPT** | 디코더 기반, 단방향 어텐션, 텍스트 생성 중심 |
| **T5** | 인코더-디코더 전체 사용, 텍스트를 모두 입력-출력 텍스트로 변환 |
이들 모델은 트랜스포머의 기본 구조를 활용하여 각각의 과제에 최적화된 방식으로 발전하였습니다.
---
## 입력 데이터 처리 및 임베딩
트랜스포머는 텍스트 데이터를 직접 처리할 수 없으므로, 수치형 벡터로 변환하는 전처리 과정이 필수적입니다.
### 토큰화 및 임베딩
먼저 입력 문장은 **토큰화(Tokenization)** 과정을 통해 최소 의미 단위인 토큰으로 분리됩니다. 분리된 각 토큰은 임베딩 층(Embedding Layer)을 통해 $d_{model}$ 차원의 연속적인 벡터로 변환됩니다. 이 과정에서 단어의 의미적 유사성이 벡터 공간상의 거리로 표현됩니다.
### 포지셔널 인코딩 (Positional Encoding)
RNN과 달리 트랜스포머는 모든 토큰을 동시에 병렬로 처리하므로, 단어의 **위치 정보(Sequential Order)**를 알 수 없습니다. 이를 해결하기 위해 임베딩 벡터에 위치 정보를 더해주는 포지셔널 인코딩을 사용합니다.
트랜스포머는 서로 다른 주기를 가진 사인(sine)과 코사인(cosine) 함수를 사용하여 위치 값을 생성합니다:
$$PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}})$$
$$PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}})$$
- $pos$: 토큰의 절대적 위치
- $i$: 차원 인덱스
- $d_{model}$: 모델의 임베딩 차원
이러한 함수적 접근은 모델이 학습 데이터에서 보지 못한 더 긴 시퀀스에 대해서도 상대적인 위치 관계를 일반화하여 학습할 수 있게 합니다.
## 아키텍처의 세부 구성 요소
### 모델 차원 및 피드포워드 네트워크
트랜스포머의 모든 서브층은 일관된 모델 차원($d_{model}$)을 유지합니다. 각 어텐션 층 이후에는 **포지션 와이즈 피드포워드 네트워크(Position-wise Feed-Forward Network)**가 배치됩니다.
이 네트워크는 두 개의 선형 변환과 하나의 **ReLU 활성화 함수**로 구성됩니다:
$$\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2$$
일반적으로 내부 은닉층의 차원은 $d_{model}$보다 훨씬 크게 설정(예: $d_{model}=512 \rightarrow d_{ff}=2048$)하여 모델의 표현력을 확장합니다.
### 레이어 정규화 (Layer Normalization)
학습의 안정성과 속도를 높이기 위해 각 서브층의 출력에 **레이어 정규화(Layer Normalization)**를 적용합니다. 트랜스포머에서는 '잔차 연결 $\rightarrow$ 레이어 정규화' 순서로 이어지는 $\text{LayerNorm}(x + \text{Sublayer}(x))$ 구조를 사용하여 기울기 소실 문제를 방지하고 최적화를 가속화합니다.
## 데이터 흐름 및 텐서 차원 변화
입력 데이터가 모델을 통과하며 겪는 텐서의 차원 변화는 다음과 같습니다. (단, $B$: 배치 크기, $N$: 시퀀스 길이, $d_{model}$: 모델 차원)
| 단계 | 입력 텐서 차원 | 연산/층 | 출력 텐서 차원 | 비고 |
| :--- | :--- | :--- | :--- | :--- |
| **입력** | $(B, N)$ | Token Embedding | $(B, N, d_{model})$ | 정수 인덱스 $\rightarrow$ 벡터 |
| **위치 부여** | $(B, N, d_{model})$ | Positional Encoding | $(B, N, d_{model})$ | 요소별 덧셈(Element-wise sum) |
| **어텐션** | $(B, N, d_{model})$ | Multi-Head Attention | $(B, N, d_{model})$ | $Q, K, V$ 연산 후 결합 |
| **FFN** | $(B, N, d_{model})$ | Feed-Forward Net | $(B, N, d_{model})$ | $d_{model} \rightarrow d_{ff} \rightarrow d_{model}$ |
| **최종 출력** | $(B, N, d_{model})$ | Linear $\rightarrow$ Softmax | $(B, N, \text{vocab\_size})$ | 다음 토큰 확률 분포 생성 |
## 어텐션 메커니즘의 심층 이해
### Q, K, V의 직관적 비유
어텐션 메커니즘의 쿼리(Query), 키(Key), 값(Value)은 정보 검색 시스템과 유사합니다.
- **Query (Q)**: "내가 지금 찾고자 하는 정보가 무엇인가?" (현재 단어의 관점)
- **Key (K)**: "나는 어떤 정보를 가지고 있는가?" (다른 모든 단어들의 색인/특징)
- **Value (V)**: "내가 제공할 실제 내용은 무엇인가?" (실제 의미 정보)
### 소프트맥스와 어텐션 맵
$QK^T$ 연산을 통해 계산된 유사도 점수에 **소프트맥스(Softmax)** 함수를 적용하면, 합계가 1이 되는 확률 분포 형태의 **어텐션 맵(Attention Map)**이 생성됩니다.

*(예시 이미지: 단어 간의 관계 강도를 히트맵으로 표현한 어텐션 맵)*
이 맵에서 높은 값을 가진 영역은 모델이 특정 단어를 처리할 때 어떤 다른 단어에 집중(Attention)하고 있는지를 시각적으로 보여줍니다.
## 기술적 한계: 복잡도 분석
트랜스포머의 가장 큰 기술적 제약은 시퀀스 길이($n$)에 따른 자원 소모량입니다.
### 시간 및 공간 복잡도
셀프 어텐션 과정에서 모든 토큰 쌍 간의 유사도를 계산해야 하므로, 연산량과 메모리 사용량은 다음과 같은 복잡도를 가집니다:
- **시간 복잡도**: $O(n^2 \cdot d)$
- **공간 복잡도**: $O(n^2)$
즉, 입력 문장의 길이가 2배가 되면 연산량과 메모리 요구량은 **4배(제곱)**로 증가합니다. 이로 인해 매우 긴 문서(Long-context)를 처리할 때 메모리 부족(Out-of-Memory) 문제가 발생하며, 이를 해결하기 위해 Linear Attention, FlashAttention, 또는 Sparse Attention과 같은 최적화 기법들이 연구되고 있습니다.
## 데이터 흐름과 모듈 간 상호작용
트랜스포머의 전체 데이터 흐름은 입력 시퀀스가 인코더를 통해 고차원 문맥 벡터로 압축되고, 이를 디코더가 참조하여 출력 시퀀스를 순차적으로 생성하는 유기적인 연결 구조를 가집니다.
**전체 데이터 흐름 다이어그램**
`입력 문장` $\rightarrow$ `인코더(Self-Attention $\rightarrow$ FFN)` $\rightarrow$ `문맥 벡터(Memory)` $\rightarrow$ `디코더(Masked Self-Attention $\rightarrow$ Encoder-Decoder Attention $\rightarrow$ FFN)` $\rightarrow$ `출력 토큰`
1. **인코더의 역할**: 입력된 전체 시퀀스를 동시에 처리하여, 각 토큰이 문장 내 다른 모든 토큰과 맺는 관계를 계산합니다. 결과적으로 생성된 **문맥 벡터(Context Vector)**는 입력 문장의 의미적 정수를 담고 있는 메모리 역할을 합니다.
2. **디코더의 상호작용**: 디코더는 두 단계의 어텐션을 통해 정보를 결합합니다. 먼저 **마스크된 자기 주의**를 통해 지금까지 생성한 단어들 간의 관계를 파악하고, 이어지는 **인코더-디코더 어텐션** 단계에서 인코더가 제공한 문맥 벡터 중 현재 생성할 단어와 가장 관련이 깊은 부분에 집중(Attention)합니다.
3. **최종 도출**: 이처럼 '이전 출력 정보'와 '입력 문장 정보'가 결합된 벡터가 최종 선형 층을 통과하여 다음 단어의 확률 분포로 변환됩니다.
## 멀티헤드 어텐션의 특징 공간(Feature Space) 분석
멀티헤드 어텐션은 단순히 연산을 여러 번 반복하는 것이 아니라, 입력 데이터를 서로 다른 **특징 공간(Feature Space)**으로 투영하여 다각도로 분석하는 아키텍처적 이점을 제공합니다.
- **다양한 관계 학습**: 각 헤드는 서로 다른 가중치 행렬($W_Q, W_K, W_V$)을 가집니다. 예를 들어, 1번 헤드는 '문법적 관계(주어-동사)'에 집중하고, 2번 헤드는 '의미적 관계(대명사-지칭 대상)', 3번 헤드는 '시간적/공간적 순서'를 학습하는 식으로 역할이 분담됩니다.
- **표현력의 확장**: 단일 헤드 어텐션은 하나의 평균적인 관계만을 포착하지만, 멀티헤드 구조는 여러 개의 부분 공간(Subspace)에서 추출된 정보를 결합함으로써 문맥의 복잡한 뉘앙스를 훨씬 정교하게 표현할 수 있습니다.
## 하드웨어 병목과 메모리 계층 구조
트랜스포머의 $O(n^2)$ 복잡도는 단순한 연산 횟수의 증가를 넘어, 실제 GPU 하드웨어의 **메모리 계층 구조(Memory Hierarchy)**에서 심각한 병목 현상을 일으킵니다.
- **HBM vs SRAM**: GPU의 메인 메모리(HBM)는 용량이 크지만 속도가 느리고, 칩 내부의 SRAM은 속도가 매우 빠르지만 용량이 매우 작습니다.
- **메모리 벽(Memory Wall) 문제**: 표준 어텐션은 $n \times n$ 크기의 거대한 어텐션 맵을 HBM에 쓰고 읽는 과정을 반복합니다. 이때 연산 속도보다 데이터를 메모리에서 읽어오는 속도가 느려 GPU 연산 유닛(CUDA 코어)이 노는 시간이 발생하는 '메모리 바운드(Memory-bound)' 현상이 발생합니다.
- **아키텍처적 접근**: 이를 해결하기 위해 중간 결과물을 HBM에 저장하지 않고 SRAM 내에서 즉시 계산하여 메모리 I/O를 최소화하는 방향으로 최적화가 진행되고 있습니다.
## 아키텍처 변형 및 최적화 구조
표준 트랜스포머의 효율성 문제를 해결하기 위해 다양한 최적화 구조가 제안되었습니다.
### FlashAttention의 메모리 절감 원리
FlashAttention은 메모리 읽기/쓰기 횟수를 획기적으로 줄여 속도와 메모리 효율을 동시에 잡은 기법입니다.
- **타일링(Tiling)**: 거대한 어텐션 행렬을 작은 블록(Tile) 단위로 쪼개어 SRAM에 올립니다.
- **재계산(Recomputation)**: 역전파(Backpropagation) 시 필요한 거대한 어텐션 맵을 모두 저장하는 대신, 필요한 부분만 SRAM에서 빠르게 재계산하여 HBM 사용량을 $O(n^2)$에서 $O(n)$ 수준으로 낮춥니다.
### 효율적 어텐션 비교
| 기법 | 핵심 원리 | 복잡도 | 특징 |
| :--- | :--- | :--- | :--- |
| **Standard** | 모든 토큰 쌍 계산 | $O(n^2)$ | 정확도가 높으나 긴 문장에 취약 |
| **Sparse** | 특정 패턴(Local, Strided)만 계산 | $O(n \sqrt{n})$ 또는 $O(n)$ | 계산량은 줄지만 정보 손실 가능성 있음 |
| **Linear** | 커널 함수를 이용해 연산 순서 변경 | $O(n)$ | 매우 빠르나 근사치 계산으로 성능 저하 가능 |
| **Flash** | IO-Aware 타일링 및 재계산 | $O(n^2)$ | 연산량은 같으나 실제 속도와 메모리 효율 극대화 |
## 인코더-디코더 구성의 전략적 선택
과제의 목적에 따라 트랜스포머의 구성 요소를 선택적으로 사용하는 아키텍처 설계 전략이 필요합니다.
| 구성 방식 | 대표 모델 | 설계 관점 및 선택 기준 | 적합한 과제 |
| :--- | :--- | :--- | :--- |
| **인코더 전용 (Encoder-only)** | BERT, RoBERTa | 입력 문장 전체를 양방향으로 참조하여 깊은 문맥적 의미를 추출하는 데 최적화 | 텍스트 분류, 개체명 인식(NER), 감성 분석 |
| **디코더 전용 (Decoder-only)** | GPT 시리즈, Llama | 이전 토큰들을 바탕으로 다음 토큰을 예측하는 자기회귀(Autoregressive) 생성에 최적화 | 텍스트 생성, 챗봇, 코드 작성 |
| **전체 구조 (Encoder-Decoder)** | T5, BART | 입력 시퀀스를 완전히 이해한 후, 이를 다른 형태의 시퀀스로 변환하는 매핑 구조에 최적화 | 기계 번역, 문서 요약, 문법 교정 |
## 참고 자료
- Vaswani, A. et al. (2017). *Attention is All You Need*. Advances in Neural Information Processing Systems (NeurIPS).
- [Google AI Blog - The Transformer: A Paradigm Shift in Sequence Modeling](https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html)
- Hugging Face Transformers 문서: [https://huggingface.co/docs/transformers](https://huggingface.co/docs/transformers)
트랜스포머는 자연어처리의 패러다임을 바꾼 혁신적인 기술이며, 현대의 인공지능 언어 모델 대부분이 그 영향 아래에서 발전하고 있습니다.